package com.tdd;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import java.math.BigDecimal;

import org.junit.Before;
import org.junit.Test;

public class RpnCalculatorTest {
	private RpnCalculator rpnCalculator;

	@Before
	public void init() {
		rpnCalculator = new RpnCalculator();
	}
	
	@Test
	public void subtractTwoNumbers() {
		rpnCalculator.push(new BigDecimal(4));
		rpnCalculator.push(new BigDecimal(-7));
		rpnCalculator.execute("-");
		assertEquals(11, rpnCalculator.peek());
	}

	@Test
	public void factorialOf5Is120() {
		rpnCalculator.push(new BigDecimal(5));
		rpnCalculator.execute("!");
		assertEquals(120, rpnCalculator.peek());
	}

	@Test
	public void factorialOfNegativeOneGeneratesException() {
		rpnCalculator.push(new BigDecimal(-1));
		try {
			rpnCalculator.execute("!");
			fail("Should have thrown exception");
		} catch (RuntimeException ignore) {
			// success
		}
	}

	@Test
	public void factorialOf1Is1() {
		rpnCalculator.push(BigDecimal.ONE);
		rpnCalculator.execute("!");
		assertEquals(1, rpnCalculator.peek());
	}

	@Test
	public void factorialOf0Is1() {
		rpnCalculator.push(BigDecimal.ZERO);
		rpnCalculator.execute("!");
		assertEquals(1, rpnCalculator.peek());
	}

	@Test
	public void newlyCreatedCalcualtorHas0Value() {
		assertEquals(0, rpnCalculator.peek());
	}

	@Test
	public void numbersEnteredAreReturnedLifo() {
		rpnCalculator.push(new BigDecimal(3));
		rpnCalculator.push(new BigDecimal(2));
		rpnCalculator.push(new BigDecimal(1));

		assertEquals(BigDecimal.ONE, rpnCalculator.pop());
		assertEquals(2, rpnCalculator.pop());
		assertEquals(3, rpnCalculator.pop());
	}
}
